package com.atguigu.chaptar1

import java.util

object Test3 {
  def main(args: Array[String]): Unit = {
    /**
     * 3、对数据中的元素按照指定规则进行分组
     * Array("zhangsan shenzhen man","lisi beijing woman","zhaoliu beijing man")
     * 规则: 按照地址进行分组
     * 结果： Map( shenzhen->List("zhangsan shenzhen man" ) , beijing->List( "lisi beijing woman","zhaoliu beijing man" ) )
     */
    val arr = Array("zhangsan shenzhen man","lisi beijing woman","zhaoliu beijing man");
    //7.外界定义函数分组规则
    val func =(x:String)=>x.split(" ")(2)
    //8.传入方法获取结果
    groupBy(arr, func)
    //9.func值传递的终极版
   groupBy(arr, _.split(" ")(2))
  }
  //1.定义高阶函数,参数1为字符串集合,func拿集合的String类型元素,
  // 考虑到外界规则为分组,将String元素分组后也为String类型,所以返回值类型也为String
  def groupBy(arr:Array[String],func:(String)=>String)={

    // 2.创建一个map容器盛装分组后的键值对
    val map = new util.HashMap[String,util.List[String]]()
    //3.遍历arr取值
    for(a<-arr){
      //4.你给我一个规则,其他事都由我来干:调用func得到分组后的key值
      val key = func(a)
      //5.进行判断,如果key已经在容器中,则将该值加入对应List,否则,创建List,将(key,list)作为kv值传入map中
      if(map.containsKey(key)){
        map.get(key).add(a)
      }else{
        val list = new util.ArrayList[String]()
        list.add(a)
        map.put(key,list)
      }
    }
    //6.方法返回map容器
    map
  }



}
